#!/bin/bash

# CourseHub 生产环境部署脚本
# 使用方法: ./deploy-production.sh [namespace]

set -e  # 遇到错误立即退出

# 配置变量
NAMESPACE=${1:-coursehub-production}
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
K8S_DIR="$(dirname "$SCRIPT_DIR")"

echo "🚀 开始部署 CourseHub 到生产环境..."
echo "📁 部署目录: $SCRIPT_DIR"
echo "🏷️  命名空间: $NAMESPACE"
echo ""

# 检查kubectl是否可用
if ! command -v kubectl &> /dev/null; then
    echo "❌ kubectl 命令未找到，请先安装 kubectl"
    exit 1
fi

# 检查集群连接
echo "🔍 检查 Kubernetes 集群连接..."
if ! kubectl cluster-info &> /dev/null; then
    echo "❌ 无法连接到 Kubernetes 集群，请检查 kubeconfig 配置"
    exit 1
fi

echo "✅ Kubernetes 集群连接正常"
echo ""

# 创建命名空间（如果不存在）
echo "📦 创建命名空间: $NAMESPACE"
kubectl create namespace $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -
echo "✅ 命名空间创建完成"
echo ""

# 部署数据库
echo "🗄️  部署 MySQL 数据库..."
echo "   创建数据库初始化脚本..."
kubectl create configmap mysql-init-script --from-file="$K8S_DIR/db/init-scripts/" -n $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -

echo "   部署数据库组件..."
kubectl apply -f "$K8S_DIR/db/mysql-secret.yaml" -n $NAMESPACE
kubectl apply -f "$K8S_DIR/db/mysql-configmap.yaml" -n $NAMESPACE
kubectl apply -f "$K8S_DIR/db/mysql-pv-pvc.yaml" -n $NAMESPACE
kubectl apply -f "$K8S_DIR/db/mysql-deployment.yaml" -n $NAMESPACE
kubectl apply -f "$K8S_DIR/db/mysql-service.yaml" -n $NAMESPACE

echo "   等待 MySQL 启动..."
kubectl wait --for=condition=ready pod -l app=mysql -n $NAMESPACE --timeout=300s
echo "✅ MySQL 数据库部署完成"
echo ""

# 部署后端应用
echo "🔧 部署后端应用..."
kubectl apply -f "$SCRIPT_DIR/backend-deployment-prod.yaml"
echo "   等待后端应用启动..."
kubectl wait --for=condition=ready pod -l app=coursehub-backend -n $NAMESPACE --timeout=300s
echo "✅ 后端应用部署完成"
echo ""

# 部署前端应用
echo "🎨 部署前端应用..."
kubectl apply -f "$SCRIPT_DIR/frontend-deployment-prod.yaml"
echo "   等待前端应用启动..."
kubectl wait --for=condition=ready pod -l app=coursehub-frontend -n $NAMESPACE --timeout=180s
echo "✅ 前端应用部署完成"
echo ""

# 部署 Ingress（可选）
echo "🌐 部署 Ingress 配置..."
if kubectl get ingressclass nginx &> /dev/null; then
    kubectl apply -f "$SCRIPT_DIR/ingress-prod.yaml"
    echo "✅ Ingress 配置部署完成"
else
    echo "⚠️  未检测到 NGINX Ingress Controller，跳过 Ingress 部署"
    echo "   你可以通过 NodePort 访问应用"
fi
echo ""

# 验证部署
echo "🔍 验证部署状态..."
echo ""
echo "📊 Pod 状态:"
kubectl get pods -n $NAMESPACE
echo ""
echo "🔗 服务状态:"
kubectl get svc -n $NAMESPACE
echo ""

# 获取访问信息
echo "🎯 应用访问信息:"
echo ""

# NodePort 访问方式
FRONTEND_NODEPORT=$(kubectl get svc coursehub-frontend-nodeport -n $NAMESPACE -o jsonpath='{.spec.ports[0].nodePort}' 2>/dev/null || echo "30080")
BACKEND_NODEPORT=$(kubectl get svc coursehub-backend-nodeport -n $NAMESPACE -o jsonpath='{.spec.ports[0].nodePort}' 2>/dev/null || echo "30082")

echo "📱 NodePort 访问方式:"
echo "   前端应用: http://localhost:$FRONTEND_NODEPORT"
echo "   后端API:  http://localhost:$BACKEND_NODEPORT"
echo "   健康检查: http://localhost:$BACKEND_NODEPORT/actuator/health"
echo ""

# Ingress 访问方式
INGRESS_HOST=$(kubectl get ingress coursehub-ingress -n $NAMESPACE -o jsonpath='{.spec.rules[0].host}' 2>/dev/null || echo "")
if [ ! -z "$INGRESS_HOST" ]; then
    echo "🌍 Ingress 访问方式:"
    echo "   应用地址: https://$INGRESS_HOST"
    echo "   后端API:  https://$INGRESS_HOST/api"
    echo ""
    echo "⚠️  请确保域名 $INGRESS_HOST 已正确解析到集群IP"
    echo ""
fi

# 端口转发访问方式
echo "🔄 端口转发访问方式（临时）:"
echo "   kubectl port-forward svc/coursehub-frontend-service 8080:80 -n $NAMESPACE"
echo "   kubectl port-forward svc/coursehub-backend-service 8082:8082 -n $NAMESPACE"
echo ""

# 健康检查
echo "🏥 执行健康检查..."
echo "   检查后端健康状态..."
if kubectl exec -n $NAMESPACE deployment/coursehub-backend -- curl -f http://localhost:8082/actuator/health &> /dev/null; then
    echo "✅ 后端应用健康检查通过"
else
    echo "⚠️  后端应用健康检查失败，请检查日志"
fi

echo "   检查前端服务..."
if kubectl exec -n $NAMESPACE deployment/coursehub-frontend -- curl -f http://localhost:80/health &> /dev/null; then
    echo "✅ 前端应用健康检查通过"
else
    echo "⚠️  前端应用健康检查失败，请检查日志"
fi

echo ""
echo "🎉 CourseHub 生产环境部署完成！"
echo ""
echo "📋 后续操作:"
echo "   1. 在浏览器中访问前端应用"
echo "   2. 测试登录和核心功能"
echo "   3. 配置监控和日志收集"
echo "   4. 设置备份策略"
echo ""
echo "🔧 常用管理命令:"
echo "   查看日志: kubectl logs -f deployment/coursehub-backend -n $NAMESPACE"
echo "   重启服务: kubectl rollout restart deployment/coursehub-backend -n $NAMESPACE"
echo "   扩容服务: kubectl scale deployment/coursehub-backend --replicas=5 -n $NAMESPACE"
echo "   删除部署: kubectl delete namespace $NAMESPACE"
echo ""
echo "📚 更多信息请参考: docs/deployment-access-guide.md"